/*******************************************************************************
* CHIPSEA F61 IIC HAL
*******************************************************************************/

#include "hal_cs_f70_iic.h"

#ifdef CS_F70

#include <stdint.h>

#include "user_interface.h"

volatile uint8_t iicErrTime = 0;

/**********************************************************************
@brief : IIC 初始�?
@param : NONE
***********************************************************************/
void User_IIC_Slave_Init(void)
{
	/*定义I2C配置结构体 */
    i2c_config_t i2c_initstruct;
    /*打开iic 时钟  */
	rcc_apb_periph_clock_config(RCC_APB_PERI_I2C, ENABLE);              
    /*复用PA10为SCL */
    system_io_multiples_set(MFP_PA_10,MFP_FUNC_2); 
    /*复用PA11为SDA */    
    system_io_multiples_set(MFP_PA_11,MFP_FUNC_2);
    /*使能发送，接收，地址匹配，stop检测中断 */
	i2c_interrupt_config((i2c_interrupt_cfg_t)(I2C_CTR1_TXISIE|I2C_CTR1_RXNEIE|I2C_CTR1_ADRMIE|I2C_CTR1_STOPDIE),ENABLE); 
    /*时钟延展使能 */
    i2c_stretch_clock_enable_ctrl(ENABLE);
    /*指定I2C_TMR寄存器值（需要参考I2C时序） */
    i2c_initstruct.tmr_value = 0x20000A0D;
    /*关闭模拟噪声滤波 */
    i2c_initstruct.analog_flag = I2C_CTR1_AFDIS;
    /*关闭数字噪声滤波 */
    i2c_initstruct.digital_value = 0x00; 
    /*设置I2C总线模式 */
    i2c_initstruct.mode = I2C_BUS_MODE_I2C;
    /*设置I2C从机地址 */
    i2c_initstruct.slave_addr1 = IIC_ADDR;
    /*设置应答使能 */
    i2c_initstruct.ack_flag = I2C_ACK_ENABLE;
    /*设置应答地址 */
    i2c_initstruct.ack_addr = I2C_ACK_ADDR_7BITS;

    /*设置I2C中断唤醒 */
    i2c_wakeup_enable_ctrl(ENABLE);
    /*初始化I2C */
	i2c_init(&i2c_initstruct);
    /*启动I2C */
	i2c_enable_ctrl(ENABLE);

    /*设置I2C中断优先级为0 */	
    nvic_irq_priority_set(IRQ_I2C_INT,0);
    /*使能iic中断 */	
	nvic_irqx_enable(IRQ_I2C_INT); 
}

/***********************************************************************
@brief : 初始化IIC相关的状态，如地�?匹配，等待寄存器地址，一次�?�信完成
@param : NONE
************************************************************************/
/*
static void I2C_State_Init(void)
{
	IIC_State.Is_Wait_RegAddr = YES;
	IIC_State.I2C_Cmd_Done    = NO;
	IIC_State.I2C_SlaveAddr_Matched = NO;
}
*/

/***********************************************************************
@brief : I2C ISR
@param : NONE
************************************************************************/

void I2C0_IRQHandler(void)
{	
	uint8_t data = 0x00;
	st_power.state = I2C_START;

	  /*判断是否为地址匹配中断 */
    if(i2c_interrupt_status_get(I2C_STS_ADRF))
    {
        /*清除地址匹配中断标记 */
        i2c_interrupt_bit_clear(I2C_STSC_ADRFC);
        /*清除发送寄存器数据 */
        i2c_txdr_data_clear();
        // iicSta = 0;
    }
    /*判断是否为接收中断 */
    if(i2c_interrupt_status_get(I2C_STS_RXNEF))
    {
        uint8_t temp;
        /*I2C数据接收 */
        temp = i2c_data_receive();

		if(st_iic.control_flag == false)                 //reg addr
		{
			st_iic.control_flag = true;

			register_select(temp);
			st_iic.w_pointer = 0;
		}
		else
		{
			if(st_iic.w_pointer < st_iic.w_count)       //write data to reg 
			{
				*(st_iic.data_ptr + st_iic.w_pointer) = temp;           
				st_iic.w_pointer++;
			}
		}
    }
    /*判断是否为发送中断 */
    if(i2c_flag_status_get(I2C_STS_TXINTF))
    {
		if(st_iic.r_pointer < st_iic.r_count)
		{
			data = *(st_iic.data_ptr + st_iic.r_pointer);
			st_iic.r_pointer++;
		}
		i2c_data_send(data);
    }
    /*判断是否为stop中断 */
	if(i2c_flag_status_get(I2C_STS_STOPF))
	{
        /*清除stop中断 */
        i2c_interrupt_bit_clear(I2C_STSC_STOPFC);
		// iicSta = 0;

		st_iic.control_flag = false;
		st_iic.r_pointer = 0;
		st_iic.w_pointer = 0;
	}
    /*清除NACK标记 */
	i2c_interrupt_bit_clear(I2C_STSC_NACKFC);
	
}

/*******************************************************************************
@brief : I2C0_BusyError
@param : NONE
*******************************************************************************/
void hal_i2c_busy_error(void)
{

	if(i2c_flag_status_get(I2C_STS_BUSYF))
	{
		iicErrTime++;
	}

	if(iicErrTime > 2)
	{       
		User_IIC_Slave_Init();
        
		iicErrTime = 0;
	}
}

#endif /* End of CS_F61 */
